`timescale 1ns / 1ps
/////////////////////////////////////////////////////////////////////////////
////                                                                     ////
//// Instituto Tecnologico de Costa Rica                                 ////
////                                                                     ////
//// Sincronizador                                                       ////
////                                                                     ////
//// Este archivo es parte del proyecto: Pong Game                       ////
//// http://repositorio-charmander.googlecode.com/svn/trunk/             ////
////                                                                     ////
//// Descripcion                                                         ////
//// Implementacion de un juego Pong como un proyecto                    ////
//// del curso de Taller de Dise;o Digital.                              ////
////                                                                     ////
//// Funcionamiento:                                                     ////
//// - Este Modulo recibe una serie de señales utilazas para el control ////
////   interno del semaforo y las sincroniza con su reloj interno,       ////
////   evitando de esta forma que hayan descordinaciones dentro del      ////
////   modulo de la FSM.                                                 ////
////                                                                     ////                                    
//// Autores:                                                            ////
//// - Gia Chen, kathya0812@gmail.com                                    ////
////   Edgar Rojas, edtec217@gmail.com                                   ////
////                                                                     ////
/////////////////////////////////////////////////////////////////////////////

module sincronizador(_clk_i,_rst_i,up_i,down_i,start_i,_sync_rst_o,_sync_up_o,_sync_down_o,_sync_start_o);
	 
	 //Inputs
	 input _clk_i;
    input _rst_i;
    input up_i;
    input down_i;
    input start_i;
	 
	 //Outputs
    output _sync_rst_o;
    output _sync_up_o;
    output _sync_down_o;
    output _sync_start_o;

	 //WIRES
	 //mantienen el valor de la se;al entre un flip-flop y el otro
	wire reset_temp;
	wire up_temp;
	wire down_temp;
	wire start_temp;

	//FLIP-FLOPS
   //Se llaman a los metodos encargados del sincronizar propiamente las se;ales
	
	//Flip-Flops Reset
	flipflop FlipFlopRST1 (._clk_i(_clk_i), .por_sincronizar_i(_rst_i), .sincronizado_o(reset_temp));
	flipflop FlipFlopRST2 (._clk_i(_clk_i), .por_sincronizar_i(reset_temp), .sincronizado_o(_sync_rst_o));

	//Flip-Flops Up
	flipflop FlipFlopUP1 (._clk_i(_clk_i), .por_sincronizar_i(up_i), .sincronizado_o(up_temp));
	flipflop FlipFlopUP2 (._clk_i(_clk_i), .por_sincronizar_i(up_temp), .sincronizado_o(_sync_up_o));

	//Flip-Flops Down
	flipflop FlipFlopDW1 (._clk_i(_clk_i), .por_sincronizar_i(down_i), .sincronizado_o(down_temp));
	flipflop FlipFlopDW2 (._clk_i(_clk_i), .por_sincronizar_i(down_temp), .sincronizado_o(_sync_down_o));

	//Flip-Flop Start
	flipflop FlipFlopSTR1 (._clk_i(_clk_i), .por_sincronizar_i(start_i), .sincronizado_o(start_temp));
	flipflop FlipFlopSTR2 (._clk_i(_clk_i), .por_sincronizar_i(start_temp), .sincronizado_o(_sync_start_o));

endmodule

